#pragma once

#include "ILista.h"
#include "NodoListaSimple.h"
#include "Comparador.h"

template <class T>
class ListaSimple: public ILista<T>
{
public:

	ListaSimple();

	ListaSimple(Puntero<Comparador<T>> comparador);

	/* retorna la cantidad de elementos de la lista */
	int Tamanio() const ;

	/* inserta el elemento x en la cabeza de la lista. La lista adminte elementos repetidos */
	void InsertarAdelante(const T &x) ;

	/* inserta el elemento x en el final de la lista. La lista adminte elementos repetidos */
	void InsertarAlFinal(const T &x) ;

	/* inserta el elemento x en la lista. La lista adminte elementos repetidos */
	void InsertarOrdenado(const T &x) ;

	/* devuelve el primer elemento de la lista */
	/*Pre: la lista no es vacia*/
	T ObtenerPrimerElemento() const ;

	/* devuelve el ultimo elemento de la lista */
	/*Pre: la lista no es vacia*/
	T ObtenerUltimoElemento() const;

	/* retorna true si la lista esta vacia */
	bool EsVacia() const ;

	/* retorna true si el la lista esta llena */
	bool EsLlena() const ;

	/* retorna true si x pertenece a la lista */
	bool Pertenece(const T &x) const ;

	/* elimina el primer elemento de la lista */
	void EliminarPrimerElemento();

	/* elimina el ultimo elemento de la lista */
	void EliminarUltimoElemento();

	/* elimina todas ocurrencias del elemento x de la lista */
	void EliminarElemento(T &x);

	/* vacia la lista*/
	void Vaciar();

	/* obtiene el Iterador de los elementos existentes en la lista*/
	Iterador<T> ObtenerIterador() const ;

private:
	Puntero<NodoListaSimple<T>> lista;
	Puntero<NodoListaSimple<T>> ultimoElemento;
	int tamanio;
	Puntero<Comparador<T>> comparador;
};

#include "ListaSimple.cpp"
